package com.george.shiro.model.controller;

import com.george.shiro.result.ResponseVO;
import com.george.shiro.util.ResultUtil;
import lombok.extern.log4j.Log4j2;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

/**
 * <p>
 *  登录相关功能
 * </p>
 *
 * @author GeorgeChan 2019/5/26 0:22
 * @version 1.0
 * @since jdk1.8
 */
@Log4j2
@Controller
@RequestMapping("/passport")
public class LoginController {
    /**
     * 跳转登录页面
     * @return 页面路径
     */
    @GetMapping("/login")
    public ModelAndView login() {
        return ResultUtil.view("/login");
    }

    /**
     * 提交登录
     * @param username 用户名
     * @param password 密码
     * @param rememberMe 是否记住登录
     * @return 登录结果返回
     */
    @ResponseBody
    @PostMapping("/signin")
    public ResponseVO submitLogin(String username, String password, boolean rememberMe) {
        UsernamePasswordToken token = new UsernamePasswordToken(username, password, rememberMe);
        // 获取当前的subject
        Subject subject = SecurityUtils.getSubject();

        // 无异常发生，表明登陆成功，出现异常catch代码块捕获
        try {
            subject.login(token);
            return ResultUtil.success("登录成功！");
        } catch (Exception e) {
            log.error("登录失败， 用户名： {}， 密码： {}", username, password);
            // 登陆失败，清楚token
            token.clear();
            return ResultUtil.error(e.getMessage());
        }
    }

    /**
     * 注销登录，返回到登录页面
     * 关于 RedirectAttributes ： https://www.cnblogs.com/g-smile/p/9121335.html
     * @return 登录页面
     */
    @GetMapping("/logout")
    public ModelAndView logout(RedirectAttributes redirectAttributes) {
        // 退出是由shiro自动实现的，我们不需要做任何操作，保留这个url就可以
        // 不要执行代码 SecurityUtils.getSubject().logout();
        // 注意： **这里是个坑**
        redirectAttributes.addAttribute("message", "您已经安全退出！");
        return ResultUtil.redirect("index");
    }
}
